{{tag> programmation}}
====== SWIG ======

[[wpfr>SWIG]] est un outil logiciel d'interfaçage pour lier des programmes en C/C++ avec des programmes de plus haut-niveau comme Python, PHP, JavaScript…"

===== Pré-requis =====
pcre-config qui vient avec le paquet libpcre3-dev:
<code>apt install libpcre3-dev</code>
g++ qui vient avec **[[apt://build-essential|build-essential]]**
<code>apt install build-essential</code>

===== Installation =====
Télécharger le paquet swig sur [[http://www.swig.org/download.html]] ((Vous pouvez passer via [[http://www.swig.org/survey.html]] afin de préciser aux développeurs quel binding (vers Python, PHP…) vous allez utiliser))

[[:tar#compression_avec_gzip_targz|Décompresser]] le fichier téléchargé:
<code>tar xvfz swig-3.0.12</code>

Lancer l'installation comme préciser sur le [[http://www.swig.org/Doc2.0/SWIGDocumentation.html#Preface_unix_installation|site de Swig]]:
<code>
./configure
make
</code>
et enfin l'installation finale avec les [[:sudo|droits d'administration]]
<code>make install</code>

===== Utilisation =====
==== Le fichier interface (.i) ====
Il contient les variables et fonctions qui vont être dans l'interface et donc appelées par le(s) programme(s) de haut-niveau
<file - exemple.i>
/* exemple.i */
 %module exemple
 %{
 /* Put header files here or function declarations like below */
 extern double My_variable;
 extern void set_My_variables(double x, int i);
 extern double get_result(void);
 extern int get_result_entier(void);
 extern void place_mode(int i);
 extern char *get_time();
 %}
 
 extern double My_variable;
 extern void set_My_variables(double x, int i);
 extern double get_result(void);
 extern int get_result_entier(void);
 extern void place_mode(int i);
 extern char *get_time();
</file>

==== Créer les fichiers d'interfaçage ====
Exemple entre c++ et python:
<code>swig -python -c++ mon_interface.i</code>

==== Créer l'interface (lib) ====
Compilation avec les fichiers d'interfaçage, ici //example.cxx// :
<code> g++ -c -std=c++14 src/*.cpp src/exemple.cxx -I./lib</code>

Éditions de liens:
<code>g++ -shared *.o -o _exemple.pyd </code>

==== Utilisation de la librairie ainsi créé ====
Dans notre exemple en python, il suffit de réaliser un //import//:
<code> >>> import exemple </code>

===== Retour d'expériences =====
==== Avantages ====
  * Séparer les parties //modèle/contrôleur// et les //vues// (modèle de programmation MVC)
  * Résoudre les problèmes de gestion d'Utf-8 en C/C++
  * Profiter des atouts du (des) langage(s) haut-niveaux, voire de leur écosystème (notamment pour python)… PyQtGraph par exemple.
  * Permet des modifications rapide dans les vues sans recompilation

==== Inconvénients ====
  * Debuggage plus difficile de l'ensemble: pdb et [[:gdb]] en ligne de commande :-/
  * Limitation dans l'usage des fonctionnalités du C++ modern (C++11/14/17) comme //auto//, //enum class//… au moins dans la partie interface

===== Voir aussi =====
[[:zeromq]]

===== Liens =====
  * [[http://www.swig.org|le site officiel de swig (en)]]
  * [[http://matthieu-brucher.developpez.com/tutoriels/python/swig-numpy/|tutoriel sur developpez.com (un peu ancien)]]

----
//Contributeurs principaux: [[:utilisateurs/bcag2]]//